home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / exe / command.c < prev    next >
C/C++ Source or Header  |  2004-07-01  |  9KB  |  342 lines

  1. /*-------------------------------------------------------------
  2.   command.c : process WM_COMMAND message
  3.   (C) 1997-2003 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "tclock.h"
  10. #include "../common/command.h"
  11.  
  12. /* Globals */
  13.  
  14. void OnTClockCommand(HWND hwnd, int id, int code);
  15. BOOL ExecCommandString(HWND hwnd, const char *command);
  16. void CopyToClipBoard(HWND hwnd, const char *pfmt);
  17.  
  18. /* Statics */
  19.  
  20. typedef struct{
  21.     BYTE   key;
  22.     DWORD  flag;
  23. } KEYEVENT, *LPKEYEVENT;
  24.  
  25. static void ShowHelp(HWND hwnd);
  26. static void PostMessageCommand(const char *option);
  27. static void ExecHiddenCmdPrompt(HWND hwnd, const char *str);
  28. static BOOL CALLBACK doKyu(HWND hwnd, long height);
  29. static void PushKeybd(LPKEYEVENT lpkey);
  30.  
  31. /*------------------------------------------------
  32.   WM_COMMAND message
  33. --------------------------------------------------*/
  34. void OnTClockCommand(HWND hwnd, int id, int code)
  35. {
  36.     switch(id)
  37.     {
  38.         case IDC_SHOWHELP: // Help
  39.             ShowHelp(hwnd);
  40.             break;
  41.         case IDC_SHOWPROP: // Property
  42.             ExecFile(hwnd, "tcprop.exe");
  43.             break;
  44.         case IDC_EXIT: // Exit
  45.             PostMessage(g_hwndClock, CLOCKM_EXIT, 0, 0);
  46.             break;
  47.         case IDC_TIMER:
  48.             ExecFile(hwnd, "tctimer.exe");
  49.             break;
  50.         case IDC_SYNCTIME: // Syncronize time
  51.             ExecFile(hwnd, "tcsntp.exe /silent");
  52.             // StartSyncTime(hwnd, NULL, 0, FALSE);
  53.             break;
  54.         case IDC_ABOUT:  // About TClock
  55.             ShowAboutBox(hwnd); // about.c
  56.             break;
  57.         case IDC_COPYCLIP: // copy to clipboard
  58.             PostMessage(g_hwndClock, CLOCKM_COPY, 0, 0);
  59.             break;
  60.         case IDC_REFRESHCLOCK: // Refresh clock
  61.             PostMessage(g_hwndClock, CLOCKM_REFRESHCLOCK, 0, 0);
  62.             break;
  63.         case IDC_DELUS:       // clear user strings
  64.             PostMessage(g_hwndClock, CLOCKM_DELUSRSTR, 0, 0);
  65.             PostMessage(g_hwndClock, CLOCKM_REFRESHCLOCK, 0, 0);
  66.             break;
  67.         case IDC_TCLOCKMENU: // context menu
  68.         {
  69.             POINT pt;
  70.             GetCursorPos(&pt);
  71.             OnContextMenu(hwnd, NULL, pt.x, pt.y);
  72.             break;
  73.         }
  74.         
  75.         case IDC_SCREENSAVER: // screen saver
  76.             SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_SCREENSAVE, 0);
  77.             break;
  78.         case IDC_SHOWDESK:    // show desktop
  79.         {
  80.             KEYEVENT key[]={
  81.                 {VK_LWIN, 0},               // Windows key down
  82.                 {'D', 0},                   // D key down
  83.                 {'D', KEYEVENTF_KEYUP},     // D key up
  84.                 {VK_LWIN, KEYEVENTF_KEYUP}, // Windows key up
  85.                 {0xff, 0}, };
  86.             PushKeybd(key);
  87.             break;
  88.         }
  89.         case IDC_KYU:  // kyu!
  90.         {
  91.             RECT rc;
  92.             GetWindowRect(GetTaskbarWindow(), &rc);
  93.             if(rc.bottom < GetSystemMetrics(SM_CYSCREEN))
  94.                 EnumWindows(doKyu, rc.bottom);
  95.             break;
  96.         }
  97.         case IDC_DELRECDOCS: // delete recently used documents
  98.             SHAddToRecentDocs(SHARD_PATH, NULL);
  99.             break;
  100.         case IDC_SHOWSTARTMENU: // open start menu
  101.         {
  102.             KEYEVENT key[] = {
  103.                 { VK_LWIN, 0 },               // Win key down
  104.                 { VK_LWIN, KEYEVENTF_KEYUP }, // Win key up
  105.                 { 0xff,0 },
  106.             };
  107.             PushKeybd(key);
  108.             break;
  109.         }
  110.         case IDC_TASKSW: // switch tasks
  111.         {
  112.             KEYEVENT key[] = {
  113.                 { VK_MENU, 0 },                  // Alt down
  114.                 { VK_SHIFT, 0 },                 // Shift down
  115.                 { VK_TAB, 0 },                   // Tab down
  116.                 { VK_TAB, KEYEVENTF_KEYUP },     // Tab up
  117.                 { VK_SHIFT, KEYEVENTF_KEYUP },   // Shift up
  118.                 { VK_MENU, KEYEVENTF_KEYUP },    // Alt up
  119.                 { 0xff, 0},
  120.             };
  121.             PushKeybd(key);
  122.             break;
  123.         }
  124.         case IDC_LOCKPC: // lock PC
  125.         {
  126.             KEYEVENT key[] = {
  127.                 { VK_LWIN, 0 },               // Win key down
  128.                 { 'L', 0 },                   // L key down
  129.                 { 'L', KEYEVENTF_KEYUP },     // L key up
  130.                 { VK_LWIN, KEYEVENTF_KEYUP }, // Win key up
  131.                 { 0xff,0 },
  132.             };
  133.             PushKeybd(key);
  134.             break;
  135.         }
  136.         case IDC_MONOFF:  // monitor off
  137.             SendMessage(GetDesktopWindow(), WM_SYSCOMMAND,
  138.                 SC_MONITORPOWER, 2);
  139.             break;
  140.     }
  141.     
  142.     // commands of task bar
  143.     if(400 < id && id <= 510)
  144.     {
  145.         HWND hwndBar = GetTaskbarWindow();
  146.         if(hwndBar)
  147.             PostMessage(hwndBar, WM_COMMAND, id, 0);
  148.     }
  149.     
  150.     // open file written in tcmenu.txt
  151.     else if(id < 100) ContextMenuCommand(hwnd, id); // menu.c
  152. }
  153.  
  154. /*------------------------------------------------
  155.   processing command string
  156. --------------------------------------------------*/
  157. BOOL ExecCommandString(HWND hwnd, const char *command)
  158. {
  159.     char cmdstr[21];
  160.     char option[MAX_PATH];
  161.     const char *p;
  162.     int i;
  163.     
  164.     if(*command == 0) return FALSE;
  165.     
  166.     p = command;
  167.     for(i = 0; i < 20 && *p; i++)
  168.     {
  169.         if(*p == ' ') break;
  170.         cmdstr[i] = *p++;
  171.     }
  172.     cmdstr[i] = 0;
  173.     
  174.     while(*p == ' ') p++;
  175.     
  176.     for(i = 0; i < MAX_PATH-1 && *p; i++)
  177.         option[i] = *p++;
  178.     option[i] = 0;
  179.     
  180.     if(strcmp(cmdstr, "clip") == 0)
  181.     {
  182.         if(option[0])
  183.             CopyToClipBoard(hwnd, option);
  184.         else if(g_hwndClock)
  185.             PostMessage(g_hwndClock, CLOCKM_COPY, 0, 0);
  186.         return FALSE;
  187.     }
  188.     else if(strcmp(cmdstr, "sntp") == 0)
  189.     {
  190.         strcpy(cmdstr, "tcsntp.exe /silent");
  191.         if(strcmp(option, "ras") == 0) strcat(cmdstr, " /ras");
  192.         ExecFile(hwnd, cmdstr);
  193.         // SNTPCommand(hwnd, option);
  194.         return FALSE;
  195.     }
  196.     else if(strcmp(cmdstr, "post") == 0)
  197.     {
  198.         PostMessageCommand(option);
  199.         return FALSE;
  200.     }
  201.     else if(command[0] == '>') {
  202.         const char *p = command;
  203.         p++;
  204.         while(*p == ' ') p++;
  205.         ExecHiddenCmdPrompt(hwnd, p);
  206.         return FALSE;
  207.     }
  208.     else
  209.         return ExecFile(hwnd, command); // common/utl.c
  210. }
  211.  
  212. /*------------------------------------------------
  213.   make tcdll.tclock to copy string to clipboard
  214. --------------------------------------------------*/
  215. void CopyToClipBoard(HWND hwnd, const char *pfmt)
  216. {
  217.     wchar_t ws[MAX_PATH];
  218.     
  219.     if(g_hwndClock)
  220.     {
  221.         MultiByteToWideChar(CP_ACP, 0, pfmt, -1, ws, MAX_PATH-1);
  222.         SendStringToOtherW(g_hwndClock, hwnd, ws, COPYDATA_COPY);
  223.     }
  224. }
  225.  
  226. /*------------------------------------------------
  227.   show help page
  228. --------------------------------------------------*/
  229. void ShowHelp(HWND hwnd)
  230. {
  231.     char helpurl[MAX_PATH];
  232.     
  233.     GetMyRegStr(NULL, "HelpURL", helpurl, MAX_PATH, "");
  234.     if(helpurl[0] == 0)
  235.     {
  236.         char langfile[MAX_PATH];
  237.         
  238.         FindFileWithLangCode(langfile, GetUserDefaultLangID(), TCLANGTXT);
  239.         
  240.         if(GetPrivateProfileString("Main", "HelpURL", "", helpurl,
  241.             MAX_PATH, langfile) == 0) return;
  242.     }
  243.     
  244.     ShellExecute(hwnd, NULL, helpurl, NULL, "", SW_SHOW);
  245. }
  246.  
  247. /*------------------------------------------------
  248.   post message to window
  249.   option : "WindowClass [WindowTitle] message [wParam] [lParam]"
  250. --------------------------------------------------*/
  251. void PostMessageCommand(const char *option)
  252. {
  253.     char param2[81], param3[11], param4[11], param5[11];
  254.     char wndclass[81], title[81];
  255.     int message = 0, wParam = 0, lParam = 0;
  256.     HWND hwnd;
  257.     
  258.     parsespace(wndclass, option, 0, 81);
  259.     parsespace(param2, option, 1, 81);
  260.     parsespace(param3, option, 2, 11);
  261.     parsespace(param4, option, 3, 11);
  262.     parsespace(param5, option, 4, 11);
  263.     
  264.     if(isdigitstr(param2))
  265.     {
  266.         title[0] = 0;
  267.         message = atoi(param2);
  268.         if(param3[0]) wParam = atoi(param3);
  269.         if(param4[0]) lParam = atoi(param4);
  270.     }
  271.     else
  272.     {
  273.         strcpy(title, param2);
  274.         if(param3[0]) message = atoi(param3);
  275.         if(param4[0]) wParam = atoi(param4);
  276.         if(param5[0]) lParam = atoi(param5);
  277.     }
  278.     
  279.     if(wndclass[0] == 0 && title[0] == 0) return;
  280.     if(message == 0) return;
  281.     
  282.     hwnd = FindWindow(wndclass[0] ? wndclass : NULL,
  283.         title[0] ? title : NULL);
  284.     if(hwnd)
  285.         PostMessage(hwnd, message, wParam, lParam);
  286. }
  287.  
  288. /*------------------------------------------------
  289.   execute cmd.exe /c ... , hiding prompt window
  290. --------------------------------------------------*/
  291. void ExecHiddenCmdPrompt(HWND hwnd, const char *str)
  292. {
  293.     SHELLEXECUTEINFO sei;
  294.     char *param;
  295.     
  296.     if(!(g_winver&WINNT)) return;
  297.     
  298.     param = malloc(strlen(str) + 4);
  299.     strcpy(param, "/c ");
  300.     strcat(param, str);
  301.     
  302.     memset(&sei,0,sizeof(sei));
  303.     sei.cbSize = sizeof(sei);
  304.     sei.nShow = SW_HIDE;
  305.     sei.lpFile = "cmd.exe";
  306.     sei.lpDirectory = g_mydir;
  307.     sei.lpParameters = param;
  308.     ShellExecuteEx(&sei);
  309.     
  310.     free(param);
  311. }
  312.  
  313. /*------------------------------------------------
  314.   send key action to Windows
  315. --------------------------------------------------*/
  316. void PushKeybd(LPKEYEVENT lpkey)
  317. {
  318.     while(lpkey->key != 0xff)
  319.     {
  320.         keybd_event(lpkey->key,
  321.             (BYTE)MapVirtualKey(lpkey->key,0), lpkey->flag, 0);
  322.         lpkey++;
  323.     }
  324. }
  325.  
  326. /*------------------------------------------------
  327.   Kyu!
  328. --------------------------------------------------*/
  329. BOOL CALLBACK doKyu(HWND hwnd, long height)
  330. {
  331.     RECT rc;
  332.     
  333.     GetWindowRect(hwnd, &rc);
  334.     
  335.     if(!IsZoomed(hwnd) && IsWindowVisible(hwnd) && (rc.top < height))
  336.         SetWindowPos(hwnd, NULL, rc.left, height, 0, 0,
  337.             SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
  338.     
  339.     return TRUE;
  340. }
  341.  
  342.